#include "Int_EeProm.h"

/**
 * @brief 添加单次数据
 *
 * @param addr 地址
 * @param datas 数据
 * @param lenth 数据长度
 * @return bit
 */
bit Int_E2prom_WriteData(u8 addr, u8 *datas, u8 lenth)
{
    u8 i;
    // 返回发送数据状态
    bit ack = 0;
    // 发送开始位
    Dri_I2c_Start();
    // 发送eeprom地址
    Dri_I2c_SendByte(EEPROM_ADDR_W);
    // 接收应答
    ack |= Dri_I2c_Receive_Ask();

    // 发送数据地址
    Dri_I2c_SendByte(addr);
    // 接收应答
    ack |= Dri_I2c_Receive_Ask();

    // 过来很多字节需要分批发送
    for (i = 0; i < lenth; i++) {

        // 发送对应的数据,一个bit一个bit发送
        Dri_I2c_SendByte(datas[i]);
        // 接收应答
        ack |= Dri_I2c_Receive_Ask();
    }

    // 结束发送
    Dri_I2c_Stop();

    return ack;
}

/**
 * @brief 发送给e2prom数据,e2prom写如数据
 *
 * @param addr 数据地址
 * @param datas 数据
 * @param lenth 数据长度
 * @return bit 是否写写入成功 ask = 0(成功), ask = 1(失败)
 */
bit Int_E2prom_WriteData_Array(u8 addr, u8 *datas, u8 lenth)
{
    u8 residue_lenth;
    // 返回发送数据状态
    bit ack = 0;
    while (1) {
        // 判断 e2prom中page剩余的位置能否存入当前数据
        //   addr%EEPROM_PAGE -> addr 是16个数据为一个page,等到当前page,剩余多少空间
        residue_lenth = EEPROM_PAGE - addr % EEPROM_PAGE;
        // 剩余的空间 > lenth 则可以可以存入数据
        if (residue_lenth >= lenth) {
            ack |= Int_E2prom_WriteData(addr, datas, lenth);
            return ack;
        } else {
            // residue_lenth 就是剩余空间,最大移动16个
            ack |= Int_E2prom_WriteData(addr, datas, residue_lenth);
            // 地址加一下
            addr = addr + residue_lenth;
            // 数据游标移动一下
            datas = datas + residue_lenth;
            // 长度减一下
            lenth = lenth - residue_lenth;

            // 延时3ms，等待写周期完成
            Delay_ms(3);
        }
    }
}

/**
 * @brief 读取eeprom数据
 *
 * @param addr 数据地址
 * @param datas 存入读取的数据
 * @param lenth 读取长度
 * @return bit
 */
bit Int_E2prom_ReadData_Array(u8 addr, u8 *datas, u8 lenth)
{
    u8 ask;
    u8 i;
    // 1. 伪写地址,让eeprom从这个位置进行读取
    // 1.1 开始信号
    Dri_I2c_Start();
    // 1.2 发送设备地址
    Dri_I2c_SendByte(EEPROM_ADDR_W);
    ask |= Dri_I2c_Receive_Ask();
    // 1.3 发送数据地址
    Dri_I2c_SendByte(addr);
    ask |= Dri_I2c_Receive_Ask();
    // 1.4 停止信号,让eeprom里面游标停止在我们需要读数据的地方
    Dri_I2c_Stop();

    Delay_ms(5);
    // 2.读取数据,在读取数据的时候,当前page读取完成后,会自动移动到下个页读取这样不需要在重新发起数据通讯,只要一个通讯就可以了
    // 2.1 开始信号
    Dri_I2c_Start();
    // 1.2 发送设备地址
    Dri_I2c_SendByte(EEPROM_ADDR_R);
    ask |= Dri_I2c_Receive_Ask();
    for (i = 0; i < lenth; i++) {
        // 2.2 读取数据
        datas[i] = Dri_I2c_Receive_Byte();
        if (i == (lenth - 1)) {
            // 2.3 发送应答信号,告诉从设备数据接收完毕
            Dri_I2c_Send_Ask(1);
        } else {
            // 2.3 发送应答信号,告诉从设备继续发送数据
            Dri_I2c_Send_Ask(0);
        }
    }
    Dri_I2c_Stop();
    return ask;
}